iT邦幫忙

2024 iThome 鐵人賽

DAY 2
0
Python

pythonGUI學習筆記系列 第 2

Day 2: PySide6 的基本窗口與佈局

  • 分享至 

  • xImage
  •  

目標:

  • 學習基本的窗口類型:QMainWindow 、 QWidget 和 QDialog
  • 理解佈局管理器(QVBoxLayout, QHBoxLayout, QGridLayout)

窗口類型

在 PySide6 中,窗口是放置小部件的容器。我們通常會用三種主要的窗口類型:

QMainWindow : 主窗口一般會有一個內建的佈局,包含多個區塊。通常窗口頂部會有菜單欄,中間的中央是內 容區,下面會有狀態欄。
https://ithelp.ithome.com.tw/upload/images/20240911/20169254X2VuLV8A1G.png

QWidget : 沒有內建佈局,通常作為一個獨立的窗口,並且嵌入到其他窗口中。例如我們可以在 QWidget 放一些元件後,在嵌入到主窗口的內容區,實現靈活的介面佈局。

QDialog : 和 QWidget 一樣沒有內建佈局,他跟 QWidget 最大的區別在於, QDialog 可以把窗口置頂,阻止用戶與其他窗口交互,直到把對話框關閉,才能進入。例如點進一些網站時,他會跳出一個對話框,要求用戶點擊「確定」,或關閉對話框後,才能繼續進行操作。

佈局管理器介紹

在介紹佈局之前,簡單說明一下 QLabel:它是一個可以用來顯示文本、圖像或其他簡單內容的部件。在範例中,QLabel 只是用來示範佈局的方式。

佈局管理器決定了小部件在窗口中的排列方式。PySide6 提供了幾種常見的佈局管理器:

QVBoxLayout : 垂直佈局,將小部件從上到下排列。下面範例是以QWidget作為基礎窗口,並把兩個QLable去做垂直排序。

from PySide6.QtWidgets import QApplication, QWidget, QLabel, QVBoxLayout

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 創建佈局
        layout = QVBoxLayout()

        # 創建標籤
        label1 = QLabel("Label 1")  # QLabel("標籤的文字")
        label2 = QLabel("Label 2")

        # 將標籤添加到佈局
        layout.addWidget(label1)
        layout.addWidget(label2)

        # 設置窗口的佈局
        self.setLayout(layout)


if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

https://ithelp.ithome.com.tw/upload/images/20240911/20169254emuInasCif.png

QHBoxLayout : 水平佈局,將小部件從左到右排列。下面範例是以QWidget作為基礎窗口,並把兩個QLable去做水平排序。

from PySide6.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 創建佈局
        layout = QHBoxLayout()

        # 創建標籤
        label1 = QLabel("Label 1")
        label2 = QLabel("Label 2")

        # 將標籤添加到佈局
        layout.addWidget(label1)
        layout.addWidget(label2)

        # 設置窗口的佈局
        self.setLayout(layout)


if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

https://ithelp.ithome.com.tw/upload/images/20240911/20169254xouseYQ1fX.png

QGridLayout : 網格佈局,允許將小部件按行和列排列。

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 創建 QGridLayout 佈局
        grid_layout = QGridLayout()

        # 創建元件
        label1 = QLabel("Label 1")
        label2 = QLabel("Label 2")
        label3 = QLabel("Label 3")
        label4 = QLabel("Label 4")


        # 將元件添加到網格中,指定行和列
        grid_layout.addWidget(label1, 0, 0)   # 第一行第一列
        grid_layout.addWidget(label2, 0, 1)   # 第一行第二列
        grid_layout.addWidget(label3, 1, 0)  # 第二行第一列
        grid_layout.addWidget(label4, 1, 1)  # 第二行第二列

        # 設置窗口的佈局
        self.setLayout(grid_layout)
     
if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

https://ithelp.ithome.com.tw/upload/images/20240911/20169254SEWdR1kt92.png

也可以使用 QVBoxLayoutQHBoxLayout 兩者同時使用形成網格佈局

from PySide6.QtWidgets import QApplication, QWidget, QLabel, QHBoxLayout, QVBoxLayout

class MyWindow(QWidget):
    def __init__(self):
        super().__init__()

        # 創建佈局
        QHlayout1 = QHBoxLayout()  # 水平佈局1
        QHlayout2 = QHBoxLayout()  # 水平佈局2
        QVlayout = QVBoxLayout()   # 垂直佈局

        # 創建標籤
        label1 = QLabel("Label 1")
        label2 = QLabel("Label 2")
        label3 = QLabel("Label 3")
        label4 = QLabel("Label 4")

        # 將QLabel添加到QHlayout1
        QHlayout1.addWidget(label1)
        QHlayout1.addWidget(label2)

        # 將QLabel添加到QHlayout2
        QHlayout2.addWidget(label3)
        QHlayout2.addWidget(label4)

        # 將兩個水平佈局添加到垂直佈局
        QVlayout.addLayout(QHlayout1)  # 注意是使用 addLayout 新增佈局而不是 addWidget 新增元件
        QVlayout.addLayout(QHlayout2)

        # 設置窗口的佈局
        self.setLayout(QVlayout)

if __name__ == "__main__":
    app = QApplication([])
    window = MyWindow()
    window.show()
    app.exec()

https://ithelp.ithome.com.tw/upload/images/20240911/201692540SCCeZjSdi.png
addLayoutaddWidget 的差別如下
addLayout : 新增佈局,到當前的佈局。
addWidget : 新增元件、控件到當前的佈局。

總結

  • 了解三個窗口, QMainWindowQWidgetQDialog ,三者的差別
  • 使用佈局管理器:理解了垂直佈局(QVBoxLayout)、 水平佈局(QHBoxLayout)和 網格佈局(QGridLayout)的概念,並且簡單使用。

上一篇
Day 1: PySide6 安裝與基礎框架
下一篇
Day 3: PySide6 的三個基礎元件
系列文
pythonGUI學習筆記30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言